/**
 * @file cutility.c
 * @brief Comandi d'utilità dell'applicativo.
 * @date Feb 27, 2012
 * @author: Francesco Corvino
 */
#include "cutility.h"

/**
 * Permette di stampare tutti i comandi registrati nell'applicazione.
 */
void exGetsAllCommands(){
	char msg[255];

	int op(DescApplication*res){
		int i;

		sprintf(msg,"Comandi registrati[%d]:\n",
				res->commands.numelement);
		FacRcv_writeStr(msg);

		for(i=0;i< res->commands.numelement;i++){
			DescCommand cmd = ((DescCommand*) res->commands.elemBuff)[i];
			char* outInfo = (char*) HiddenType_executeInterpreter(&cmd.descriptorInfo,NULL);
			sprintf(msg,"%d * %s : %s \n", i,cmd.name,
					(outInfo==NULL)?("<<No info>>"):(outInfo));
			FacRcv_writeStr( msg );
		}
		return i;
	}
	FactApp_getApplicationAccess(op);

}

/**
 * @brief Effettua la chiusura del programma.
 */
void exCloseProgram(){
	FacRcv_writeStr("Avvio procedura di terminazione");
	FactApp_terminateAll();
}

void exLoadLibrary(){
	// ricerca il parametro e controlla se è valido

	// esegue il caricamento cercando una funzione che restituisca un SimpleDescCommand

	// avvia il caricamento di ogni entry
}

SimpleDescCommand defcmd[] = {
		{"help","Fornisce le informazioni sui comandi disponibili",exGetsAllCommands},
		{"exit","Esce dall'applicazione",exCloseProgram},
		{"load","Carica una libreria dinamica nell'applicazione",exLoadLibrary}
};

/**
 * @brief Funzione pubblica che permette di caricare tutti i comandi definiti per la libreria.
 */
void cutility_LoadAllCommands(){
	int i;
	for(i=0;i<2;i++){
		HiddenType helpfnc = { (void*) defcmd[i].helpstr,
				getHiddenTypeToString };
		FactApp_addCommand(invoke_defineCompleteCMD(
				defcmd[i].namecmd,defcmd[i].execfnc,&helpfnc,NULL));
	}
}


